package com.baidu.ueditor;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.baidu.ueditor.define.ActionMap;
import com.baidu.ueditor.define.AppInfo;
import com.baidu.ueditor.define.BaseState;
import com.baidu.ueditor.define.State;
import com.baidu.ueditor.hunter.FileManager;
import com.baidu.ueditor.hunter.ImageHunter;
import com.baidu.ueditor.upload.Uploader;

public class ActionEnter {

  private HttpServletRequest request = null;

  private String rootPath = null;
  private String contextPath = null;

  private String actionType = null;

  private ConfigManager configManager = null;

  public ActionEnter(HttpServletRequest request, String rootPath) {

    this.request = request;
    this.rootPath = rootPath;
    this.actionType = request.getParameter("action");
    this.contextPath = request.getContextPath();
    this.configManager = ConfigManager.getInstance(this.rootPath, this.contextPath, request.getRequestURI());

  }

  public String exec() {

    String callbackName = this.request.getParameter("callback");

    if (callbackName != null) {

      if (!validCallbackName(callbackName)) {
        return new BaseState(false, AppInfo.ILLEGAL).toJSONString();
      }

      return callbackName + "(" + this.invoke() + ");";

    } else {
      return this.invoke();
    }

  }

  public String invoke() {

    if (actionType == null || !ActionMap.mapping.containsKey(actionType)) {
      return new BaseState(false, AppInfo.INVALID_ACTION).toJSONString();
    }

    if (this.configManager == null || !this.configManager.valid()) {
      return new BaseState(false, AppInfo.CONFIG_ERROR).toJSONString();
    }

    State state = null;

    int actionCode = ActionMap.getType(this.actionType);

    Map<String, Object> conf = null;

    switch (actionCode) {

      case ActionMap.CONFIG:
        return this.configManager.getAllConfig().toString();

      case ActionMap.UPLOAD_IMAGE:
      case ActionMap.UPLOAD_SCRAWL:
      case ActionMap.UPLOAD_VIDEO:
      case ActionMap.UPLOAD_FILE:
        conf = this.configManager.getConfig(actionCode);
        state = new Uploader(request, conf).doExec();
        break;

      case ActionMap.CATCH_IMAGE:
        conf = configManager.getConfig(actionCode);
        String[] list = this.request.getParameterValues((String) conf.get("fieldName"));
        state = new ImageHunter(conf).capture(list);
        break;

      case ActionMap.LIST_IMAGE:
      case ActionMap.LIST_FILE:
        conf = configManager.getConfig(actionCode);
        int start = this.getStartIndex();
        state = new FileManager(conf).listFile(start);
        break;

    }

    return state.toJSONString();

  }

  public int getStartIndex() {

    String start = this.request.getParameter("start");

    try {
      return Integer.parseInt(start);
    } catch (Exception e) {
      return 0;
    }

  }

  /**
   * callback参数验证
   */
  public boolean validCallbackName(String name) {

    if (name.matches("^[a-zA-Z_]+[\\w0-9_]*$")) {
      return true;
    }

    return false;

  }

}